package cn.bearspark.article.provider.dao.mapper;

import cn.bearspark.article.provider.dao.co.ArticleCO;
import cn.bearspark.article.provider.dao.po.article.ArticleBasePO;
import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Set;

/**
 * 专栏基础数据的数据映射接口
 *
 * @author f
 */
@Mapper
public interface ArticleBaseMapper extends RedisHashMapper<ArticleCO> {

    /**
     * 保存专栏基础数据
     *
     * @param articleBasePO 专栏的基础数据对象
     */
    void insert(ArticleBasePO articleBasePO);

    /**
     * 批量修改专栏的可见性，用于定时发布专栏的功能
     *
     * @param visibility    专栏的可见性
     * @param articleIdList 专栏的 id 集合
     */
    void updateVisibility(Integer visibility, List<Long> articleIdList);

    /**
     * 查询指定专栏的热数据
     *
     * @param articleIdSet 指定的专栏的 id Set
     * @return 指定专栏的热数据集合
     */
    @Override
    List<ArticleCO> listHotData(Set<Long> articleIdSet);

    /**
     * 查询指定专栏的数据
     *
     * @param articleIdList 指定的专栏的 id Set
     * @return 指定专栏的数据集合
     */
    @Override
    List<ArticleCO> listData(List<Long> articleIdList);

    /**
     * 修改指定专栏的基础数据
     *
     * @param articleBasePO 专栏的基础数据
     */
    void update(ArticleBasePO articleBasePO);

    /**
     * 删除指定专栏的基础数据
     *
     * @param articleId 指定的专栏 id
     */
    @Delete("DELETE FROM t_article_base WHERE article_id = #{articleId}")
    void deleteById(long articleId);

    /**
     * 增加指定专栏的收藏数
     *
     * @param articleId 指定的专栏 id
     */
    @Update("UPDATE t_article_base SET collect_num = collect_num + 1 WHERE article_id = #{articleId}")
    void incrCollectNum(long articleId);

    /**
     * 减少指定专栏的收藏数
     *
     * @param articleId 指定的专栏 id
     */
    @Update("UPDATE t_article_base SET collect_num = collect_num - 1 WHERE article_id = #{articleId}")
    void decrCollectNum(long articleId);

    /**
     * 增加指定专栏的功德数
     *
     * @param articleId 指定的专栏 id
     */
    @Update("UPDATE t_article_base SET merit_num = merit_num + 1 WHERE article_id = #{articleId}")
    void incrMeritNum(long articleId);

    /**
     * 分页查询指定用户的所有专栏 id
     *
     * @param offset     偏移量
     * @param size       元素数
     * @param userId     指定的用户 id
     * @return 指定用户的所有专栏 id 的集合
     */
    @Select("SELECT article_id FROM t_article_base " +
            "WHERE user_id = #{userId} AND visibility <= #{visCode} " +
            "ORDER BY article_id DESC " +
            "LIMIT #{offset}, #{size}")
    List<Long> listUserArticleId(int offset, int size, long userId, int visCode);
}
